home *** CD-ROM | disk | FTP | other *** search
/ Multimedia Producer's Bible / Multimedia Producer's Bible.iso / mac / mTropolis / mTropolis Sampler Files / mFactory Object Model Examples / Source / Beep / Beep.c next >
Encoding:
C/C++ Source or Header  |  1996-01-04  |  6.3 KB  |  279 lines  |  [TEXT/MMCC]

  1. /*    Beep.c
  2. **
  3. **    Copyright 1995, mFactory, Inc.
  4. **    All rights reserved.
  5. */
  6.  
  7. #include "Beep.h"
  8.  
  9. #define kActivatePopup        6                                                // DITL indices
  10. #define kNumBeepsField        9
  11.  
  12. #define kBeepsAttrib        ((CompID *) "beeps\0\0\0\0\0\0\0\0\0\0\0")        // attribute
  13.  
  14.  
  15. /*    Initial entry point
  16. */
  17.  
  18. MCompMainFuncDcl MCompMainName(MInitInfo *initInfo)
  19. {
  20.     MDefineComponent(BeepComp, kMCanDragOff);
  21.     MInheritClass(MComponent, kMCompNumProcs, kMBaseCompSlot);
  22.  
  23.     // MComponent methods we must override
  24.  
  25.     MDefineMethod(kBeepSlot, kMBaseCompSlot, kMCompConstructor, MCompConstructor);
  26.     MDefineMethod(kBeepSlot, kMBaseCompSlot, kMCompCopy, MCompCopy);
  27.     MDefineMethod(kBeepSlot, kMBaseCompSlot, kMCompCopyConstructor, MCompCopyConstructor);
  28.     MDefineMethod(kBeepSlot, kMBaseCompSlot, kMCompDestructor, MCompDestructor);
  29.  
  30.     // MComponent methods we choose to override
  31.  
  32.     MDefineMethod(kBeepSlot, kMBaseCompSlot, kMCompEditorOpen, MCompEditorOpen);
  33.     MDefineMethod(kBeepSlot, kMBaseCompSlot, kMCompEditorAccept, MCompEditorAccept);
  34.  
  35.     MDefineMethod(kBeepSlot, kMBaseCompSlot, kMCompGetSaveInfo, MCompGetSaveInfo);
  36.     MDefineMethod(kBeepSlot, kMBaseCompSlot, kMCompSaveComponent, MCompSaveComponent);
  37.     MDefineMethod(kBeepSlot, kMBaseCompSlot, kMCompRestoreComponent, MCompRestoreComponent);
  38.  
  39.     MDefineMethod(kBeepSlot, kMBaseCompSlot, kMCompEnabled, MCompEnabled);
  40.     MDefineMethod(kBeepSlot, kMBaseCompSlot, kMCompDisabled, MCompDisabled);
  41.     
  42.     MDefineMethod(kBeepSlot, kMBaseCompSlot, kMCompProcessMessage, MCompProcessMessage);
  43.  
  44.     MDefineMethod(kBeepSlot, kMBaseCompSlot, kMCompGetAttribute, MCompGetAttribute);
  45.     MDefineMethod(kBeepSlot, kMBaseCompSlot, kMCompSetAttribute, MCompSetAttribute);
  46.  
  47.     MDefineMethod(kBeepSlot, kMBaseCompSlot, kMCompAdaptIDs, MCompAdaptIDs);
  48.  
  49.     MConnectCommonServices(initInfo);
  50.  
  51.     MEndComponentDef;
  52. }
  53.  
  54.  
  55. /*    Initialize component
  56. */
  57.  
  58. static MErr MCompConstructor(BeepComp *self, MObjectRef *mRef)
  59. {
  60.     MInitEvent(self->f_activateEvent, kMParentEnabled, 0);
  61.     MInitInteger(self->f_beeps, 1);
  62.     return kMNoCompErr;
  63. }
  64.  
  65.  
  66. /*    Copy component data
  67. */
  68.  
  69. static MErr MCompCopy(BeepComp *self, BeepComp *previousSelf)
  70. {
  71.     MCopyEvent(self->f_activateEvent, previousSelf->f_activateEvent);
  72.     MCopyInteger(self->f_beeps, previousSelf->f_beeps);
  73.     return kMNoCompErr;
  74. }
  75.  
  76.  
  77. /*    Copy component
  78. */
  79.  
  80. static MErr MCompCopyConstructor(BeepComp *self, BeepComp *previousSelf, MObjectRef *mRef)
  81. {
  82.     MCompConstructor(self, mRef);
  83.     return MCompCopy(self, previousSelf);
  84. }
  85.  
  86.  
  87. /*    Dispose component
  88. */
  89.  
  90. static MErr MCompDestructor(BeepComp *self)
  91. {
  92.     MDisposeEvent(self->f_activateEvent);
  93.     MDisposeInteger(self->f_beeps);
  94.     return kMNoCompErr;
  95. }
  96.  
  97.  
  98. /*    Open component dialog
  99. */
  100.  
  101. static MErr MCompEditorOpen(BeepComp *self, void *editor, short editorType)
  102. {
  103.     if ( editorType == kMDialogEditorType ) {
  104.         MSetEditorItem(editor, kActivatePopup, (MDataType *) &self->f_activateEvent);
  105.         MSetEditorItem(editor, kNumBeepsField, (MDataType *) &self->f_beeps);
  106.         return kMNoCompErr;
  107.     }
  108.     else
  109.         return kMUnableToComplyCompErr;
  110. }
  111.  
  112.  
  113. /*    Close component dialog
  114. */
  115.  
  116. static MErr MCompEditorAccept(BeepComp *self, void *editor)
  117. {
  118.     MGetEditorItem(editor, kActivatePopup, (MDataType *) &self->f_activateEvent);
  119.     MGetEditorItem(editor, kNumBeepsField, (MDataType *) &self->f_beeps);
  120.     return kMNoCompErr;
  121. }
  122.  
  123.  
  124. /*    Provide save information
  125. */
  126.  
  127. static MErr MCompGetSaveInfo(BeepComp *self, MFileIOServ *file, long saveInfo, short *rev, long *len)
  128. {
  129.     long    valueSize;
  130.  
  131.     MSizeOfValue(file, &self->f_activateEvent, &valueSize);
  132.     *len = valueSize;
  133.     MSizeOfValue(file, &self->f_beeps, &valueSize);
  134.     *len += valueSize;
  135.  
  136.     *rev = kBeepRev;
  137.     return kMNoCompErr;
  138. }
  139.  
  140.  
  141. /*    Save component
  142. */
  143.  
  144. static MErr MCompSaveComponent(BeepComp *self, MFileIOServ *file, long saveInfo)
  145. {
  146.     MWriteValue(file, &self->f_activateEvent);
  147.     MWriteValue(file, &self->f_beeps);
  148.     return kMNoCompErr;
  149. }
  150.  
  151.  
  152. /*    Restore component
  153. */
  154.  
  155. static MErr MCompRestoreComponent(BeepComp *self, MFileIOServ *file, long saveInfo, short rev)
  156. {
  157.     if (rev == kBeepRev) {
  158.         MReadValue(file, &self->f_activateEvent);
  159.         MReadValue(file, &self->f_beeps);
  160.         return kMNoCompErr;
  161.     }
  162.     else
  163.         return kMUnableToComplyCompErr;
  164. }
  165.  
  166.  
  167. /*    Component enabled in runtime
  168. */
  169.  
  170. static MErr MCompEnabled(BeepComp *self)
  171. {
  172.     MRegisterMouseFeedback(self, &self->f_activateEvent);
  173.     return kMNoCompErr;
  174. }
  175.  
  176.  
  177. /*    Component disabled in runtime
  178. */
  179.  
  180. static MErr MCompDisabled(BeepComp *self)
  181. {
  182.     MDeregisterMouseFeedback(self, &self->f_activateEvent);
  183.     return kMNoCompErr;
  184. }
  185.  
  186.  
  187. /*    Get component attribute
  188. */
  189.  
  190. static MErr MCompGetAttribute(BeepComp *self, MomID attribName, MDataType *selector, MDataType *dataValue)
  191. {
  192.     if (MCmpMomID(attribName, kMEventsAttrib) && selector) {
  193.         if (selector->f_type.f_type == kMInteger) {
  194.             switch (selector->f_integer.f_value & ~kMEventMask) {
  195.                 case kMEventExecute:
  196.                     if ((selector->f_integer.f_value & kMEventMask) == 1) {
  197.                         MCopyEvent(dataValue->f_event, self->f_activateEvent);
  198.                         return kMNoCompErr;
  199.                     }
  200.                     else
  201.                         return kMUnableToComplyCompErr;
  202.  
  203.                 default :
  204.                     return kMUnableToComplyCompErr;
  205.             }
  206.         }
  207.         else
  208.             return kMUnableToComplyCompErr;
  209.     }
  210.     else if (MCmpMomID(attribName, kBeepsAttrib)) {
  211.         MCopyInteger(dataValue->f_integer, self->f_beeps);
  212.         return kMNoCompErr;
  213.     }
  214.     else
  215.         return kMUnableToComplyCompErr;
  216. }
  217.  
  218.  
  219. /*    Set component attribute
  220. */
  221.  
  222. static MErr MCompSetAttribute(BeepComp *self, MomID attribName, MDataType *selector, MDataType *dataValue)
  223. {
  224.     if ( MCmpMomID(attribName, kBeepsAttrib) ) {
  225.         MCoerceType(self, dataValue, (MDataType *) &self->f_beeps);
  226.         return MError();
  227.     }
  228.     else
  229.         return kMUnableToComplyCompErr;
  230. }
  231.  
  232.  
  233. /*    Process incoming message
  234. */
  235.  
  236. static MErr MCompProcessMessage(BeepComp *self, MMessagePtr message)
  237. {
  238.     long i;      
  239. #ifdef _Windows_
  240.     long lastTick = 0;
  241.     long tick;       
  242.     BOOL didSound;     
  243. #endif
  244.                 
  245.      if ( MDetectMessage(message, self->f_activateEvent) ) {
  246.         for (i=0; i<self->f_beeps.f_value; i++) 
  247.         {    
  248.             #ifdef _Macintosh_
  249.                 SysBeep(1);
  250.             #elif _Windows_
  251.                 didSound = FALSE;
  252.                 while( didSound == FALSE )
  253.                 {
  254.                     MGetGlobalTime( &tick );    
  255.                     if( tick - lastTick > 120 )
  256.                     {    
  257.                         MessageBeep(MB_ICONEXCLAMATION); 
  258.                         didSound = TRUE;
  259.                         lastTick = tick;
  260.                     }    
  261.                 }     
  262.             #endif       
  263.         }
  264.         return kMNoCompErr;
  265.     }
  266.     else
  267.         return kMUnableToComplyCompErr;
  268. }
  269.  
  270.  
  271. /*    Adjust project-specific IDs
  272. */
  273.  
  274. static MErr MCompAdaptIDs(BeepComp *self, MObjectPtr *sourceStore, MObjectPtr *targetStore)
  275. {
  276.     MTranslateID(kMTranslateEventID, sourceStore, targetStore, (MDataType *) &self->f_activateEvent);
  277.     return kMNoCompErr;
  278. }
  279.